#!/bin/bash

# 这是一款采用 Gtkdialog 来编写的 you-get 视频下载程序的图形前端。
# 本程序在 GPL v2 的条款下分发。
# 安装和使用详见 README.md 文档。
# 脚本的核心下载功能由 you-get 提供。
# (c) 2023 LanXing <lanxing0821@126.com>

### 脚本的执行路径 ###
export SCRIPT_RUN_PATH="$(readlink -f "$0")"

### 脚本的工作目录 ###
export WORKDIR="$(dirname "$SCRIPT_RUN_PATH")"

### 导出环境 ###
export XDG_DATA_DIRS="$WORKDIR/share:${XDG_DATA_DIRS:-/usr/local/share:/usr/share:/usr/share/plasma}"
export PATH="$WORKDIR/bin:${PATH:-/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin}"

case ":${PATH}:" in
	*:"$HOME/.local/bin":*)
	;;
	*)  export PATH="$HOME/.local/bin:$PATH"
	;;
esac

### 检测是否已经安装 gtkdialog ###
if command -v gtkdialog > /dev/null ;then :
else
	zenity --title="错误信息" --error --width 240 --text="监测到你的系统并没有安装 gtkdialog ，脚本运行需要 gtkdialog ！"
	exit
fi

### 重要提醒对话框 ###
remind_info(){
	cat <<-EOF | gtkdialog --stdin
	<window title="重要提醒" window-position="3" allow-grow="false" icon-name="gd-alert-triangle">
		<vbox>
			<hbox space-expand="true" space-fill="true" width-request="500">
				<pixmap theme-icon-size="64">
					<input file icon="gd-message-square"></input>
				</pixmap>
				<vbox>
				<text xalign="0" justify="0" wrap="true" use-markup="true">
					<label>"
	
	脚本的核心下载功能需要 <span fgcolor='Crimson'><b>you-get</b></span> 的支持，请先到"
					</label>
				</text>
				<eventbox hover-selection="true">
					<text xalign="0" justify="0" wrap="true" use-markup="true">
						<label>"    
			<span fgcolor='CornflowerBlue'><i><u>https://github.com/soimort/you-get</u></i></span>
						"</label>
					</text>
					<action signal="button-press-event">xdg-open "https://github.com/soimort/you-get" &</action>
				</eventbox> 
				<text xalign="0" justify="0" wrap="true" use-markup="true">
					<label>"下载 <span fgcolor='Crimson'><b>you-get</b></span> 。
	
	<span fgcolor='BlueViolet'><b>现在是否转到指定站点？</b></span>
					"</label>
				</text>
				</vbox>
			</hbox>
			<hseparator></hseparator>
			<hbox>
				<button theme-icon-size="16" width-request="80">
					<label>"  是"</label>
					<input file icon="gd-check-circle"></input>
					<action>exit:Yes</action>
				</button>
				<button theme-icon-size="16" width-request="80">
					<label>"  否"</label>
					<input file icon="gd-slash"></input>
					<action>exit:No</action>
				</button>
			</hbox>
		</vbox>
	</window>
	EOF
}

### 检测是否已经安装 you-get ###
if command -v you-get > /dev/null ;then :
else
	for i in $(remind_info | grep -E '^[a-z_A-Z][a-zA-Z_0-9]*=".*"[[:blank:]]*$'); do
		eval $i
	done
	if [ "$EXIT" = "Yes" ]; then
		xdg-open "https://github.com/soimort/you-get"
	fi
	exit
fi

### 安装对话框 ###
install_dialog(){
	cat <<-EOF | gtkdialog --stdin
	<window title="安装" window-position="3" allow-grow="false" icon-name="gd-message-circle">
		<vbox>
			<hbox space-expand="true" space-fill="true" width-request="500">
				<pixmap theme-icon-size="64">
					<input file icon="gd-message-square"></input>
				</pixmap>
				<text xalign="0" justify="0" wrap="true" use-markup="true">
					<label>"
	
			<span size='x-large'>您是否要为 <span fgcolor='Purple'><b>You-Get GUI</b></span> 创建启动器？</span>
		
	创建启动器可以让您很方便地从<span fgcolor='CornflowerBlue'><b>应用程序菜单</b></span>中打开应用。
					"</label>
				</text>
			</hbox>
			<hseparator></hseparator>
			<hbox>
				<button theme-icon-size="16" width-request="80">
					<label>"  是"</label>
					<input file icon="gd-check-circle"></input>
					<action>exit:Yes</action>
				</button>
				<button theme-icon-size="16" width-request="80">
					<label>"  否"</label>
					<input file icon="gd-slash"></input>
					<action>exit:No</action>
				</button>
			</hbox>
		</vbox>
	</window>
	EOF
}

### 将脚本集成到系统 ###
if [ $EUID -ne 0 ]; then
	DESTINATION_DIR_DESKTOP="$HOME/.local/share/applications"
else
	DESTINATION_DIR_DESKTOP="/usr/share/applications"
fi
desktopFilePath="$DESTINATION_DIR_DESKTOP/You-Get-GUI.desktop"
# 检测是否存在桌面配置文件
if [ -e "$desktopFilePath" ] ; then :
else
	for i in $(install_dialog | grep -E '^[a-z_A-Z][a-zA-Z_0-9]*=".*"[[:blank:]]*$'); do
		eval $i
	done
	if [ "$EXIT" = "Yes" ]; then
		cat > "$desktopFilePath" <<-EOF
		#!/usr/bin/env xdg-open
		[Desktop Entry]
		Type=Application
		Version=1.0
		Name=You-Get GUI
		Exec="$WORKDIR/AppRun" %u
		Icon=you-get-gui
		GenericName=媒体下载工具
		Comment=You-Get —— 基于 Python3 的媒体下载工具
		StartupWMClass=You-Get-GUI
		Categories=Network;Shell
		MimeType=text/plain;
		Terminal=false
		NoDisplay=false
		Hidden=false
		
		Actions=uninstall;
		
		[Desktop Action uninstall]
		Icon=edit-delete
		Name=卸载 You-Get GUI
		Exec="$WORKDIR/bin/uninstall.sh"
		EOF
		xdg-icon-resource install --novendor --size 512 "$WORKDIR/you-get-gui.png"
		xdg-desktop-menu forceupdate
	fi
fi

### 接受参数并阻止脚本多次执行（只允许运行一个实例） ###
path="$1"
export PIPELINE="${TMPDIR:=/tmp}/You-Get-GUI_Pipeline"
[ -f "$PIPELINE" ] || > "$PIPELINE"
if [ -f "$path" ] ;then
	echo -n "$path" > "$PIPELINE"
elif echo "$path" | grep -q '^http' ;then
	echo -n " $path" >> "$PIPELINE"
fi
mwpid=$(ps -ef | grep "gtkdialog --class=You-Get-GUI --name=You-Get-GUI --stdin"  | grep -v grep | awk '{printf $2}')
if [ "$mwpid" ];then
	wmctrl -a "You-Get-GUI" -x			# 快速切换并激活主窗口
	exit
fi

### 存储配置文件的目录 ###
export CONFIG_DIR="$WORKDIR/config"								# 所有配置文件都存在这里
export WINDOW_CONF="$CONFIG_DIR/window.conf"					# 窗口配置文件
export DEFAULT_OPTIONS="$CONFIG_DIR/default-options.conf"		# 预设选项配置文件
export SITE_LIST="$CONFIG_DIR/sitelist.conf"					# 记录支持站点
export PLAYER_LIST="$CONFIG_DIR/player-list.conf"				# you-get 的 -p 选项能调用的播放器列表
export MERGED_INPUTRC="$CONFIG_DIR/merged-inputrc"				# 合并 bash 的初始化文件

### 生成窗口配置文件，你可以在图形界面中修改它 ###
[ -d "$CONFIG_DIR" ] || mkdir "$CONFIG_DIR"
[ -f "$WINDOW_CONF" ] || cat > "$WINDOW_CONF" <<EOF
# 这是窗口配置文件，你可以在这个文件中进行修改，也可以在图形界面中修改它
# 配置内容包括窗口外观和终端设置两部分

[window]
# 窗口的透明度，允许值：[0-1]，可以是小数
Opacity="1.00"
# 按钮等控件中的图标颜色，允许值：16进制标准颜色名称，#rgb或#rrggbb
IconColor="#4a1792"

[terminal]
# 终端字体，允许值：字体名称，一般表示形式为 "名称 [样式] [大小]"
FontName="Hack 9"
# 背景色调颜色，允许值：16进制标准颜色名称，#rgb或#rrggbb
BackgroundTintColor="#a7b4bd"
# 文本背景色，允许值：16进制标准颜色名称，#rgb或#rrggbb
TextBackgroundColor="#ffffff"
# 文本前景色，允许值：16进制标准颜色名称，#rgb或#rrggbb
TextForegroundColor="#272728"
# 粗体文本前景色，允许值：16进制标准颜色名称，#rgb或#rrggbb
BoldForegroundColor="#ff0e0c"
# 暗淡文本前景色，允许值：16进制标准颜色名称，#rgb或#rrggbb
DimForegroundColor="#55077f"
# 光标背景颜色，允许值：16进制标准颜色名称，#rgb或#rrggbb
CursorBackgroundColor="#ffffff"
# 高亮文本背景颜色
HighlightBackgroundColor="#6a0f05"
EOF

# 遍历配置文件，并读取其中的变量
I=$IFS; IFS=$'\n'
for TAB in $(cat "$WINDOW_CONF" | grep -E '^[a-z_A-Z][a-zA-Z_0-9]*=".*"[[:blank:]]*$');do
	eval $TAB
done
IFS=$I

# 如果图标颜色与 $IconColor 变量不符，则替换图标颜色为 $IconColor 
IocnPath="$WORKDIR/share/icons/hicolor/scalable/actions"
OneSvg=$(ls -t "$IocnPath"/*.svg | sed -n '1p')
if echo "$OneSvg" | xargs grep -q "$IconColor" ;then :
else
	SvgColor=$(cat "$OneSvg" | grep -o '#.*' | cut -d\" -f1)
	for i in $(ls "$IocnPath"/*.svg) ;do
		sed -i "s/$SvgColor/${IconColor:-#4a1792}/g" "$i"
	done
fi

### 读取用户目录 ###
I=$IFS; IFS=$'\n'
for XDG_DIR in $(cat "$HOME/.config/user-dirs.dirs" | grep -E '^[a-z_A-Z][a-zA-Z_0-9]*=".*"[[:blank:]]*$');do
	eval "$XDG_DIR"
done
IFS=$I
: ${XDG_DOWNLOAD_DIR:=${HOME}/Downloads}

### 预设选项，你可以在图形界面中修改它 ###
[ -f "$DEFAULT_OPTIONS" ] || cat > "$DEFAULT_OPTIONS" <<EOF
# 这个配置文件包含了窗口初始化时，操作 you-get 所需的默认选项；
# 在这个文件中（即 $DEFAULT_OPTIONS）所做的修改，都会在下次启动程序保持生效。
# 多数选项的可选值是一个布尔常量（true 或 false），当值为 true 时，表示选用该选项。
# 相应的，在主窗口上，与该选项相关的绘图指示符也会处于被勾选状态。
# 当然，这只是窗口初始化时小部件的活动状态，并不意味着实际操作中不能更改。

[General options]
# 这里包含了下载时需要设置的一些常规选项。

# -F STREAM_ID，--format STREAM_ID，指定多媒体的质量代码 (具体查看 -i 选项的输出)
format_opt="false"
STREAM_ID=""

# --itag CONTAINER，指定多媒体的封装格式 (具体查看 -i 选项的输出)
itag_opt="false"
CONTAINER=""

# -O OUTPUT_NAME，--output-filename OUTPUT_NAME，设置输出文件名，这是固定选项，无需修改
# output_filename_opt="true"
OUTPUT_NAME=""

# -t SECONDS，--timeout SECONDS，设置套接字超时时长
timeout_opt="false"
# 超时时长（单位：秒）
SECONDS="60"

# -c COOKIES_FILE, --cookies COOKIES_FILE，加载 cookies.txt 或 cookies.sqlite
cookies_opt="false"
# 这里填写 cookies.txt 或 cookies.sqlite 文件的路径
COOKIES_FILE=""

# -l, --playlist，将所给的多媒体 URL 作为播放列表进行下载
playlist_opt="false"

# -n, --no-merge，不合并视频分片
no_merge_opt="false"

# --no-caption，不要下载字幕(字幕、歌词、弹幕、…)
no_caption_opt="false"

# --postfix，使用唯一的标识符来下载文件
postfix_opt="false"

# -f, --force，强制覆盖现有文件
force_opt="false"

# --skip-existing-file-size-check，跳过现有文件而不检查文件大小
skip_existing_opt="false"

# -d, --debug，打印跟踪和其他调试信息
debug_opt="false"

# -a, --auto-rename，当有同名文件时，自动重命名新下载的文件
auto_rename_opt="false"

# -k，--insecure，允许不安全的 SSL 连接（忽略 SSL 错误）
insecure_opt="false"

# -m, --m3u8，使用 m3u8 网址下载视频
m3u8_opt="false"

# -------------- #

# -o OUTPUT_DIR，--output-dir OUTPUT_DIR，设置输出目录，这是固定选项，无需修改
# output_dir_opt="true"
# 输出目录
OUTPUT_DIR="$XDG_DOWNLOAD_DIR/Video"

# -p PLAYER, --player PLAYER，将提取的 URL 流式传输到播放器，这是固定选项，无需修改
# player_opt="true"
# 设置 -p 选项所调用的播放器，这是固定选项
PLAYER="mpv"

[Unknown options]
# 这些选项不知道干嘛用的，胡乱加上去。某些选项其实作用不大。

#  -P PASSWORD, --password PASSWORD，设置视频访问密码为 PASSWORD
password_opt="false"
PASSWORD=""

# --first FIRST，第一个数字
first_opt="false"
FIRST="0"

# --last LAST，最后一个数字
last_opt="false"
LAST="0"

# --size PAGE_SIZE, --page-size PAGE_SIZE，页面大小的数字
page_size_opt="false"
PAGE_SIZE="0"

[Proxy options]
# 代理设置，国外用户下载国内视频，或者国内用户下载国外视频，这些选项都会用得上。

# 默认使用系统代理
system_proxy_opt="true"

# -x HOST:PORT, --http-proxy HOST:PORT，使用一个 HTTP 代理进行下载
http_proxy_opt="false"

# -y HOST:PORT, --extractor-proxy HOST:PORT，只使用 HTTP 代理进行提取
extractor_proxy_opt="false"

# --no-proxy，不使用代理
no_proxy_opt="false"

# -s HOST:PORT or USERNAME:PASSWORD@HOST:PORT, --socks-proxy HOST:PORT or USERNAME:PASSWORD@HOST:PORT，使用 SOCKS5 代理进行下载
socks5_opt="false"

# 代理服务器，采用【 主机:端口 】的文本形式，比如 proxy.uku.im:8888
PROXY_SERVER=""

# SOCKS5 代理用户名
SOCKS5_PROXY_USERNAME=""

# SOCKS5 代理密码
SOCKS5_PROXY_PASSWORD=""

[Dry-run options]
# 三个复用解析数据选项（非下载选项），默认选用 -i 选项

# -i, --info，打印提取的信息
extractor_info_opt="true"

# -u, --url，获得页面所有可下载 URL 列表
extractor_urls_opt="false"

# --json，以 JSON 格式打印提取的 URL 列表
extractor_json_opt="false"

# -l, --playlist，配合以上的三个选项一起使用，以确定是否提取整个播放列表
extractor_playlist_opt="false"

# 当使用 --json 选项时，是否保存文件到输出目录
save_json_opt="false"
EOF

I=$IFS; IFS=$'\n'
for TAB in $(cat "$DEFAULT_OPTIONS" | grep -E '^[a-z_A-Z][a-zA-Z_0-9]*=".*"[[:blank:]]*$');do
    eval $TAB
done
IFS=$I

[ -d "$OUTPUT_DIR" ] || mkdir -p "$OUTPUT_DIR"

### 支持的站点 ###
[ -f "$SITE_LIST" ] || cat > "$SITE_LIST" <<EOF
[site-list]
# 这里只列出 you-get 支持的部分站点
# 更多支持站点可以在 https://github.com/soimort/you-get/blob/develop/README.md 中查询

 YouTube | https://www.youtube.com/ | ✓ |  |  
 Twitter | https://twitter.com/ | ✓ | ✓ |  
 VK | http://vk.com/ | ✓ | ✓ |  
 Vine | https://vine.co/ | ✓ |  |  
 Vimeo | https://vimeo.com/ | ✓ |  |  
 Veoh | http://www.veoh.com/ | ✓ |  |  
 Tumblr | https://www.tumblr.com/ | ✓ | ✓ | ✓ 
 TED | http://www.ted.com/ | ✓ |  |  
 SoundCloud | https://soundcloud.com/ |  |  | ✓ 
 SHOWROOM | https://www.showroom-live.com/ | ✓ |  |  
 Pinterest | https://www.pinterest.com/ |  | ✓ |  
 MTV81 | http://www.mtv81.com/ | ✓ |  |  
 Mixcloud | https://www.mixcloud.com/ |  |  | ✓ 
 Metacafe | http://www.metacafe.com/ | ✓ |  |  
 Magisto | http://www.magisto.com/ | ✓ |  |  
 Khan Academy | https://www.khanacademy.org/ | ✓ |  |  
 Internet Archive | https://archive.org/ | ✓ |  |  
 Instagram | https://instagram.com/ | ✓ | ✓ |  
 InfoQ | http://www.infoq.com/presentations/ | ✓ |  |  
 Imgur | http://imgur.com/ |  | ✓ |  
 Heavy Music Archive | http://www.heavy-music.ru/ |  |  | ✓ 
 Freesound | http://www.freesound.org/ |  |  | ✓ 
 Flickr | https://www.flickr.com/ | ✓ | ✓ |  
 FC2 Video | http://video.fc2.com/ | ✓ |  |  
 Facebook | https://www.facebook.com/ | ✓ |  |  
 eHow | http://www.ehow.com/ | ✓ |  |  
 Dailymotion | http://www.dailymotion.com/ | ✓ |  |  
 Coub | http://coub.com/ | ✓ |  |  
 CBS | http://www.cbs.com/ | ✓ |  |  
 Bandcamp | http://bandcamp.com/ |  |  | ✓ 
 AliveThai | http://alive.in.th/ | ✓ |  |  
 interest.me | http://ch.interest.me/tvn | ✓ |  |  
 755  ナナゴーゴー | http://7gogo.jp/ | ✓ | ✓ |  
 niconico  ニコニコ動画 | http://www.nicovideo.jp/ | ✓ |  |  
 163  网易视频 | http://v.163.com/ | ✓ |  | ✓ 
 网易云音乐 | http://music.163.com/ | ✓ |  | ✓ 
 56网 | http://www.56.com/ | ✓ |  |  
 AcFun | http://www.acfun.cn/ | ✓ |  |  
 Baidu  百度贴吧 | http://tieba.baidu.com/ | ✓ | ✓ |  
 爆米花网 | http://www.baomihua.com/ | ✓ |  |  
 bilibili  哔哩哔哩 | http://www.bilibili.com/ | ✓ | ✓ | ✓ 
 豆瓣 | http://www.douban.com/ | ✓ |  | ✓ 
 斗鱼 | http://www.douyutv.com/ | ✓ |  |  
 凤凰视频 | http://v.ifeng.com/ | ✓ |  |  
 风行网 | http://www.fun.tv/ | ✓ |  |  
 iQIYI  爱奇艺 | http://www.iqiyi.com/ | ✓ |  |  
 激动网 | http://www.joy.cn/ | ✓ |  |  
 酷6网 | http://www.ku6.com/ | ✓ |  |  
 酷狗音乐 | http://www.kugou.com/ |  |  | ✓ 
 酷我音乐 | http://www.kuwo.cn/ |  |  | ✓ 
 乐视网 | http://www.le.com/ | ✓ |  |  
 荔枝FM | http://www.lizhi.fm/ |  |  | ✓ 
 懒人听书 | http://www.lrts.me/ |  |  | ✓ 
 秒拍 | http://www.miaopai.com/ | ✓ |  |  
 MioMio弹幕网 | http://www.miomio.tv/ | ✓ |  |  
 MissEvan  猫耳FM | http://www.missevan.com/ |  |  | ✓ 
 痞客邦 | https://www.pixnet.net/ | ✓ |  |  
 PPTV聚力 | http://www.pptv.com/ | ✓ |  |  
 齐鲁网 | http://v.iqilu.com/ | ✓ |  |  
 QQ  腾讯视频 | http://v.qq.com/ | ✓ |  |  
 企鹅直播 | http://live.qq.com/ | ✓ |  |  
 Sina  新浪视频 | http://video.sina.com.cn/ | ✓ |  |  
 微博秒拍视频 | http://video.weibo.com/ | ✓ |  |  
 Sohu  搜狐视频 | http://tv.sohu.com/ | ✓ |  |  
 Tudou  土豆 | http://www.tudou.com/ | ✓ |  |  
 阳光卫视 | http://www.isuntv.com/ | ✓ |  |  
 Youku  优酷 | http://www.youku.com/ | ✓ |  |  
 战旗TV | http://www.zhanqi.tv/lives | ✓ |  |  
 央视网 | http://www.cntv.cn/ | ✓ |  |  
 Naver  네이버 | http://tvcast.naver.com/ | ✓ |  |  
 芒果TV | http://www.mgtv.com/ | ✓ |  |  
 火猫TV | http://www.huomao.com/ | ✓ |  |  
 阳光宽频网 | http://www.365yg.com/ | ✓ |  |  
 西瓜视频 | https://www.ixigua.com/ | ✓ |  |  
 新片场 | https://www.xinpianchang.com/ | ✓ |  |  
 快手 | https://www.kuaishou.com/ | ✓ | ✓ |  
 抖音 | https://www.douyin.com/ | ✓ |  |  
 TikTok | https://www.tiktok.com/ | ✓ |  |  
 新传宽频 | https://v.zhibo.tv/ | ✓ |  |  
 中国体育直播TV | https://video.zhibo.tv/ | ✓ |  |  
 知乎 | https://www.zhihu.com/ | ✓ |  |  
EOF

### you-get 的 -p 选项能调用的播放器列表 ###
[ -f "$PLAYER_LIST" ] || cat > "$PLAYER_LIST" <<'EOF'
[player-list]
# 该配置文件包含了 you-get 的 -p 选项所能调用的播放器列表。
# 如果默认提供的列表中没有你想要的播放器，可以在下面手动添加。
# 添加时，每个程序的可执行文件只能放在单独的一行，并且不能带有参数！
# 可执行文件可以是绝对路径名（名称中不得包含任何空白符），也可以是 $PATH 变量中的命令名称。

mpv
vlc
cvlc
mplayer
smplayer
firefox
chrome
chromium
vivaldi
EOF

### 合并初始化文件 ###
[ -f "$MERGED_INPUTRC" ] || cat > "$MERGED_INPUTRC" <<'EOF'
# 清除屏幕
clear

# 定义主提示符
unset PROMPT_COMMAND
PS1="𝙀𝙉𝘿 "

# 不启用历史功能
set +o history

# 防止因意外输入 EOF 字符时，导致 shell 退出
set -o ignoreeof

# 当终端收到 INT 或 QUIT 信号时，解除 you-get 的运行状态
trap 'echo -n "false" > "$You_Get_RUN_STATUS"' INT QUIT
EOF

### 数据缓存目录，关机后会自动清空。 ###
export CACHE_DIR="/dev/shm/You-Get-GUI"
[ -d "$CACHE_DIR" ] || mkdir "$CACHE_DIR"

# 记录 you-get 的运行状态，如果为 true ，则阻止执行某些指令。初始状态为 false
export You_Get_RUN_STATUS="$CACHE_DIR/You_GetRunStatus.device"
echo -n "false" > "$You_Get_RUN_STATUS"

# 接收命令，并转递给终端执行。初始命令合并 $MERGED_INPUTRC 文件
export CONSOLE_COMMAND="$CACHE_DIR/ConsoleCommand.device"
echo ". $MERGED_INPUTRC" > "$CONSOLE_COMMAND"

# 存储 you-get 的 -i 选项的输出
export FILE_INFO="$CACHE_DIR/FileInfo.device"
> "$FILE_INFO"

# 可编辑的选项，下载器从中读取参数
export EDITABLE_OPTIONS="$CACHE_DIR/EditableOptions.device"
cat "$DEFAULT_OPTIONS" > "$EDITABLE_OPTIONS"

# 标签页索引
export FEEDBACK_PAGE="$CACHE_DIR/FeedbackPage.device"
echo -n 0 > "$FEEDBACK_PAGE"

### 记录窗口的位置和大小，以备下次按此位置大小来启动主窗口 ###
export GEOMETRY="$CACHE_DIR/Geometry.device"
export GEOMETRY_BORDER="$CACHE_DIR/GeometryBorder.device"
export SAVE_GEOMETRY="$CACHE_DIR/SaveGeometry"

[ -f "$SAVE_GEOMETRY" ] || cat > "$SAVE_GEOMETRY" <<'EOF'
# 获得窗口ID
WID=$(xdotool getwindowfocus)

# 获得窗口的位置和大小等信息
XWININFO=$(xwininfo -stats -id $WID)
HEIGHT=$(echo "$XWININFO" | grep 'Height:' | awk '{print $2}')
WIDTH=$(echo "$XWININFO" | grep 'Width:' | awk '{print $2}')
Xa=$(echo "$XWININFO" | grep 'Absolute upper-left X' | awk '{print $4}')
Ya=$(echo "$XWININFO" | grep 'Absolute upper-left Y' | awk '{print $4}')
Xb=$(echo "$XWININFO" | grep 'Relative upper-left X' | awk '{print $4}')
Yb=$(echo "$XWININFO" | grep 'Relative upper-left Y' | awk '{print $4}')
X=$((Xa-Xb))
Y=$((Ya-Yb))

# $GEOMETRY_BORDER 文件记录了窗口管理器所设置的边框宽度和标题栏高度，
# 如果存在就读取它，以便调取其中的变量
if [ -f "$GEOMETRY_BORDER" ];then
	. "$GEOMETRY_BORDER"
else
	BX=0
	BY=0
fi

# 这才是初始化窗口应该调取的 X 和 Y 位置，
# 它们需要自身减去窗口的边框宽度和标题栏高度
X=$((X>BX?X-BX:0))
Y=$((Y>BY?Y-BY:0))

# 将窗口的位置和大小，输送到 $GEOMETRY 文件
echo "HEIGHT=$HEIGHT"	>  "$GEOMETRY"
echo "WIDTH=$WIDTH"		>> "$GEOMETRY"
echo "X=$X"				>> "$GEOMETRY"
echo "Y=$Y"				>> "$GEOMETRY"
EOF

if [ -f "$GEOMETRY" ];then
	. "$GEOMETRY"
else
	HEIGHT=760
	WIDTH=1280
	X=0
	Y=0
fi

### 启动主程序窗口 ###
cat <<EOF | sed '/<!--.*-->/d' | gtkdialog --class=You-Get-GUI --name=You-Get-GUI --stdin  --geometry +"$X"+"$Y"
<window title="You-Get GUI" icon-name="you-get-gui" border-width="0" default-height="$HEIGHT" default-width="$WIDTH" opacity="$Opacity">
	<vbox>
		
		<!-- 菜单栏 -->
		<menubar>
			<menu use-underline="true">
				<menuitem use-underline="true" icon-name="gd-folder"  label="打开输出文件夹(_D)..." accel-key="0x44" accel-mods="4" height-request="32">
					<action>xdg-open "\$OUTPUT_DIR"</action>
				</menuitem>
                <menuitem use-underline="true" icon-name="gd-file-text"  label="从文件中读取 URL (_F)..." accel-key="0x46" accel-mods="4" height-request="32">
                    <action>fileselect:UrlPath</action>
                </menuitem>
				<menuitem use-underline="true" icon-name="gd-settings"  label="设置(_S)..." accel-key="0x53" accel-mods="4" height-request="32">
					<action>Settings.sh &</action>
				</menuitem>
				<menuitemseparator></menuitemseparator>
				<menuitem use-underline="true" icon-name="gd-x-circle"  label="退出(_Q)" accel-key="0x51" accel-mods="4" height-request="32">
					<action>exit:Quit</action>
				</menuitem>
				<label>菜单(_M)</label>
			</menu>
		</menubar>
		
		<text label=" " height-request="10"></text>
		
		<!-- 这里输入要下载或播放的多媒体链接和文件路径 -->
		<hbox>
			<text label=" " width-request="20"></text>
			<text label="URLs/文件路径：" xalign="0"></text>
			<entry primary-icon-name="gd-play-circle" primary-icon-tooltip-text="-p 选项，直接调用播放器而不是下载；可以在下面的『播放程序』选项中选择播放器；推荐使用 mpv"
				secondary-icon-name="gd-delete" secondary-icon-tooltip-text="消除文本" file-monitor="true" auto-refresh="true" fs-title="请选择有 URL 内容的文本文件" fs-folder="$HOME" fs-filters-mime="text/plain" 
				tooltip-text="输入多个链接时，请用空格隔开；也可以输入含有 URL 的文件路径（非播放列表文件，并且文件中一行只能有一个多媒体链接）。由于输入框对文本长度的限制，建议在输入时，长链接最好不要超过 5 个，短链接最好不要超过 12 个。超出长度限制（512个字符）的文本会被截断。">
				<variable>UrlPath</variable>
				<input file>"$PIPELINE"</input>
				<action signal="file-changed">refresh:UrlPath</action>
				<action signal="file-changed">sed -i "s/OUTPUT_NAME=.*/OUTPUT_NAME=\"\"/" "\$EDITABLE_OPTIONS"</action>
				<action signal="file-changed">refresh:OUTPUT_NAME</action>
				<action signal="file-changed">: > "\$FILE_INFO" &</action>
				<action signal="primary-icon-press">player.sh \$PLAYER \$UrlPath &</action>
				<action signal="secondary-icon-press">clear:UrlPath</action>
				<action>save:UrlPath</action>
				<output file>"$PIPELINE"</output>
			</entry>
			<button tooltip-text="向终端发送下载任务指令" theme-icon-size="16" width-request="100" relief="1" focus-on-click="false">
				<label>"  开始下载"</label>
				<input file icon="gd-download-cloud"></input>
				<action condition="file_is_true($You_Get_RUN_STATUS)">info-dialog.sh true &</action>
				<action condition="file_is_false($You_Get_RUN_STATUS)">downloader.sh -d \$UrlPath</action>
				<action condition="file_is_false($You_Get_RUN_STATUS)">echo -n 1 > "\$FEEDBACK_PAGE"</action>
				<action condition="file_is_false($You_Get_RUN_STATUS)">refresh:VTE</action>
				<action condition="file_is_false($You_Get_RUN_STATUS)">refresh:FEEDBACK</action>
				<!-- action condition="command_is_true( [ \$PTR_BTN = 3 ] && echo true )" signal="button-release-event">echo -n "false" > "\$You_Get_RUN_STATUS"</action -->
			</button>
			<text label=" " width-request="20"></text>
		</hbox>
		
		<hbox space-expand="true" space-fill="true">
		
			<!-- 此框架储存了所支持的站点信息，以及操作时所反馈的信息 -->
			<vbox>
				<frame 信息回馈>
					<hbox homogeneous="true">
						<button tooltip-text="列出所有支持的多媒体网站，点击可以转到指定站点" theme-icon-size="16" width-request="100" 
							relief="1" focus-on-click="false">
							<label>"  站点"</label>
							<input file icon="gd-dribbble"></input>
							<action>echo -n 0 > "\$FEEDBACK_PAGE"</action>
							<action>refresh:FEEDBACK</action>
						</button>
						<button tooltip-text="终端用于显示命令回馈的信息，不建议输入并执行其它的命令。" 
							theme-icon-size="16" width-request="100" relief="1" focus-on-click="false">
							<label>"  终端"</label>
							<input file icon="gd-terminal"></input>
							<action>echo -n 1 > "\$FEEDBACK_PAGE"</action>
							<action>refresh:FEEDBACK</action>
						</button>
						<button tooltip-text="用于显示点击『提取信息』按钮时（默认为 -i 选项）所反馈的视频信息" theme-icon-size="16" 
							width-request="100" relief="1" focus-on-click="false">
							<label>"  信息"</label>                            
							<input file icon="gd-info"></input>
							<action>echo -n 2 > "\$FEEDBACK_PAGE"</action>
							<action>refresh:FEEDBACK</action>
						</button>
					</hbox>
					<notebook labels="站点|终端|信息" show-tabs="false" homogeneous="true" show-border="true" space-expand="true" space-fill="true">
						<tree column-header-active="false|false|false|false|false" column-resizeable="false|false|false|false|false" 
							column-visible="true|true|true|true|true" hover-selection="true" exported-column="1">
							<label>" 网站 | URL | 视频? | 图像? | 音频? "</label>
							<input>cat "\$SITE_LIST" | sed '/^#\|\[.*\]\|^[[:space:]]*$/d'</input>
							<variable>SitesURL</variable>
							<action signal="button-release-event">[ \$SitesURL ] && xdg-open \$SitesURL &</action>
							<action signal="key-release-event" condition="command_is_true([ \$KEY_RAW = 0x24 -o \$KEY_RAW = 0x41 ] && echo true)">[ \$SitesURL ] && xdg-open \$SitesURL &</action>
						</tree>
						<terminal argv0="/bin/bash" 
							envv0="TERM=xterm-256color" 
							current-directory-uri="/dev/shm" 
							font-name="$FontName"
							cursor-shape="2"
							background-tint-color="$BackgroundTintColor"
							text-background-color="$TextBackgroundColor"
							text-foreground-color="$TextForegroundColor"
							bold-foreground-color="$BoldForegroundColor"
							dim-foreground-color="$DimForegroundColor"
							cursor-background-color="$CursorBackgroundColor"
							highlight-background-color="$HighlightBackgroundColor"
							hscrollbar-policy="2"
							vscrollbar-policy="2"
							sensitive="true"
							pointer-autohide="true"
						>
							<variable>VTE</variable>
							<width>100</width>
							<input>cat "$CONSOLE_COMMAND"</input>
						</terminal>
						<edit editable="false" cursor-visible="false" auto-refresh="true" wrap-mode="1">
							<input file>"$FILE_INFO"</input>
						</edit>
						<variable>FEEDBACK</variable>
						<input file>"$FEEDBACK_PAGE"</input>
					</notebook>
				</frame>
			</vbox>
			
			<!-- 此框架提供了命令操作所需的参数选项 -->
			<frame 操作选项>
				<hbox>
					<button tooltip-text="只显示多媒体信息而不进行下载；默认使用 -i 选项来提取信息，如需使用其它选项，请在下面的【提取选项】标签卡中设置" space-expand="false" space-fill="false" theme-icon-size="16" 
						width-request="100" relief="1" focus-on-click="false">
						<label>"  提取信息"</label>
						<input file icon="gd-eye"></input>
						<action condition="command_is_true( [ ! -s \"\$FILE_INFO\" ] && echo true )">extracted-info.sh \$OUTPUT_DIR \$UrlPath &</action>
						<action condition="command_is_true( [ ! -s \"\$FILE_INFO\" ] && echo true )">echo -n 2 > "\$FEEDBACK_PAGE"</action>
						<action condition="command_is_true( [ ! -s \"\$FILE_INFO\" ] && echo true )">refresh:FEEDBACK</action>
					</button>
					<text width-request="100" space-expand="true" space-fill="true" label=" "></text>
					<button tooltip-text="-p 选项，调用 axel 来加速下载，这对于某些下载慢的站点比较有用；下载容器格式为 m3u8 的视频时，不建议使用该选项。该选项会忽略除了输出路径以外的其它选项。此外，这个功能的实现不是十分的完善，如果不是下载太慢的话，最好不要使用。" 
						space-expand="false" space-fill="false" theme-icon-size="16" width-request="100" relief="1" focus-on-click="false">
						<label>"  调用 axel"</label>
						<input file icon="gd-anchor"></input>
						<action condition="file_is_true($You_Get_RUN_STATUS)">info-dialog.sh true &</action>
						<action condition="file_is_false($You_Get_RUN_STATUS)">downloader.sh -a \$UrlPath</action>
						<action condition="file_is_false($You_Get_RUN_STATUS)">echo -n 1 > "\$FEEDBACK_PAGE"</action>
						<action condition="file_is_false($You_Get_RUN_STATUS)">refresh:VTE</action>
						<action condition="file_is_false($You_Get_RUN_STATUS)">refresh:FEEDBACK</action>
					</button>
					<button tooltip-text="向终端发送 clear 命令，以清除终端屏幕；有任务时不能执行该命令" space-expand="false" 
						space-fill="false" theme-icon-size="16" width-request="100" relief="1" focus-on-click="false">
						<label>"  清除屏幕"</label>
						<input file icon="gd-airplay"></input>
						<action condition="file_is_false($You_Get_RUN_STATUS)">echo clear > "\$CONSOLE_COMMAND"</action>
						<action condition="file_is_false($You_Get_RUN_STATUS)">echo -n 1 > "\$FEEDBACK_PAGE"</action>
						<action condition="file_is_false($You_Get_RUN_STATUS)">refresh:VTE</action>
						<action condition="file_is_false($You_Get_RUN_STATUS)">refresh:FEEDBACK</action>
						<action condition="file_is_true($You_Get_RUN_STATUS)">info-dialog.sh clear &</action>
					</button>
					<button tooltip-text="-h 选项，在终端上打印 you-get 的帮助信息；有任务时不能执行该命令" space-expand="false" 
						space-fill="false" theme-icon-size="16" width-request="100" relief="1" focus-on-click="false">
						<label>"  帮助信息"</label>
						<input file icon="gd-help-circle"></input>
						<action condition="file_is_false($You_Get_RUN_STATUS)">echo 'clear;you-get -h' > "\$CONSOLE_COMMAND"</action>
						<action condition="file_is_false($You_Get_RUN_STATUS)">echo -n 1 > "\$FEEDBACK_PAGE"</action>
						<action condition="file_is_false($You_Get_RUN_STATUS)">refresh:VTE</action>
						<action condition="file_is_false($You_Get_RUN_STATUS)">refresh:FEEDBACK</action>
						<action condition="file_is_true($You_Get_RUN_STATUS)">info-dialog.sh clear &</action>
					</button>
				</hbox>
				<notebook labels="常规选项|代理设置|提取选项|其它选项" homogeneous="true" space-expand="true" space-fill="true" focus-on-click="false" can-focus="false">
					
					<!-- 常规选项 -->
					<vbox>
						<text xalign="0" label="对以下选项做出的修改，在下次启动时不会保留：" height-request="32"></text>
						<hbox tooltip-text="-F，--format 选项，指定多媒体的质量代码（具体查看 -i 选项的输出）；如果不勾选或者输入框为空，则默认选择最高清晰度">
							<checkbox width-request="100" focus-on-click="false" can-focus="false" space-fill="false" space-expand="false">
								<label>质量代码：</label>
								<default>"$format_opt"</default>
								<variable>format_opt</variable>
								<action>if true enable:STREAM_ID</action>
								<action>if false disable:STREAM_ID</action>
								<action>sed -i "s/format_opt=.*/format_opt=\"\$format_opt\"/" "\$EDITABLE_OPTIONS"</action>
							</checkbox>
							<entry secondary-icon-name="gd-delete" secondary-icon-tooltip-text="消除文本">
								<variable>STREAM_ID</variable>
								<sensitive>"$format_opt"</sensitive>
								<input>cat "\$EDITABLE_OPTIONS" | grep "STREAM_ID=" | cut -d\" -f2 </input>
								<action signal="secondary-icon-press">clear:STREAM_ID</action>
								<action>text-filter.sh -F "\$STREAM_ID"</action>
								<action>refresh:STREAM_ID</action>
							</entry>
						</hbox>
						<hbox tooltip-text="--itag 选项，指定多媒体的封装格式代码（具体查看 -i 选项的输出，请勿直接填写 mp4 之类的内容）；如果不勾选或者输入框为空，则选择默认格式；如果只有一种封装格式，则无需指定。">
							<checkbox width-request="100" focus-on-click="false" can-focus="false" space-fill="false" space-expand="false">
								<label>封装格式：</label>
								<default>"$itag_opt"</default>
								<variable>itag_opt</variable>
								<action>if true enable:CONTAINER</action>
								<action>if false disable:CONTAINER</action>
								<action>sed -i "s/itag_opt=.*/itag_opt=\"\$itag_opt\"/" "\$EDITABLE_OPTIONS"</action>
							</checkbox>
							<entry secondary-icon-name="gd-delete" secondary-icon-tooltip-text="消除文本">
								<variable>CONTAINER</variable>
								<sensitive>"$itag_opt"</sensitive>
								<input>cat "\$EDITABLE_OPTIONS" | grep "CONTAINER=" | cut -d\" -f2 </input>
								<action signal="secondary-icon-press">clear:CONTAINER</action>
								<action>text-filter.sh --itag "\$CONTAINER"</action>
								<action>refresh:CONTAINER</action>
							</entry>
						</hbox>
						<hbox tooltip-text="-O，--output-filename 选项，设置输出文件名，名称中不得包含被 shell 视为具有特殊意义的字符，否则将会自动替换为其变体符号（非中文标点符号）；如果输入框为空，则由 you-get 自行决定下载文件的名称；当有多个媒体链接或启用了列表模式（ -l 选项）时，忽略该选项">
							<checkbox width-request="100" focus-on-click="false" can-focus="false" inconsistent="true" space-fill="false" space-expand="false">
								<label>文件名称：</label>
								<default>true</default>
								
								<!-- 将一些代码注释封存 -->
								<!-- default>"$output_filename_opt"</default -->
								<!-- variable>output_filename_opt</variable -->
								<!-- action>if true enable:OUTPUT_NAME</action -->
								<!-- action>if false disable:OUTPUT_NAME</action -->
								<!-- action>sed -i "s/output_filename_opt=.*/output_filename_opt=\"\$output_filename_opt\"/" "\$EDITABLE_OPTIONS"</action -->
								
							</checkbox>
							<entry $(: primary-icon-name="gd-file-plus" primary-icon-tooltip-text="自动获取文件名称，部分站点可能无效" )
								secondary-icon-name="gd-delete" secondary-icon-tooltip-text="消除文本">
								<variable>OUTPUT_NAME</variable>
								<!-- sensitive>"$output_filename_opt"</sensitive -->
								<input>cat "\$EDITABLE_OPTIONS" | grep "OUTPUT_NAME=" | cut -d\" -f2 </input>
							
								<!-- 将一些代码注释封存 -->
								<!-- action signal="primary-icon-press" condition="command_is_true( [ \"\$UrlPath\" ] && echo true )">text-filter.sh -n \$UrlPath</action -->
								<!-- action signal="primary-icon-press" condition="command_is_true( [ \"\$UrlPath\" ] && echo true )">refresh:OUTPUT_NAME</action -->
								<!-- action signal="primary-icon-press" condition="command_is_true( [ \"\$UrlPath\" ] && echo true )">echo -n 2 > "\$FEEDBACK_PAGE"</action -->
								<!-- action signal="primary-icon-press" condition="command_is_true( [ \"\$UrlPath\" ] && echo true )">refresh:FEEDBACK</action -->
								
								<action signal="secondary-icon-press">clear:OUTPUT_NAME</action>
								<action>text-filter.sh -N "\$OUTPUT_NAME"</action>
								<action>refresh:OUTPUT_NAME</action>
							</entry>
						</hbox>
						<hbox tooltip-text="-t，--timeout 选项，设置套接字超时时长；如果不勾选，则使用默认时长">
							<checkbox width-request="100" focus-on-click="false" can-focus="false" space-fill="false" space-expand="false">
								<label>超时时长：</label>
								<default>"$timeout_opt"</default>
								<variable>timeout_opt</variable>
								<action>if true enable:SECONDS</action>
								<action>if false disable:SECONDS</action>
								<action>sed -i "s/timeout_opt=.*/timeout_opt=\"\$timeout_opt\"/" "\$EDITABLE_OPTIONS"</action>
							</checkbox>
							<spinbutton range-min="0" range-max="3600" wrap="true" space-fill="true" space-expand="true">
								<default>"$SECONDS"</default>
								<variable>SECONDS</variable>
								<sensitive>"$timeout_opt"</sensitive>
								<action>sed -i "s/SECONDS=.*/SECONDS=\"\$SECONDS\"/" "\$DEFAULT_OPTIONS"</action>
								<action>sed -i "s/SECONDS=.*/SECONDS=\"\$SECONDS\"/" "\$EDITABLE_OPTIONS"</action>
								<action signal="changed">sed -i "s/SECONDS=.*/SECONDS=\"\$SECONDS\"/" "\$DEFAULT_OPTIONS"</action>
								<action signal="changed">sed -i "s/SECONDS=.*/SECONDS=\"\$SECONDS\"/" "\$EDITABLE_OPTIONS"</action>
							</spinbutton>
						</hbox>
						<hbox tooltip-text="-c，--cookies 选项，加载 cookies.txt 或 cookies.sqlite ，该选项适用于需要登录才能观看的媒体（例如, 私密视频，VIP 会员视频）。注意，勾选该选项有可能会导致部分站点下载失败。">
							<checkbox width-request="100" focus-on-click="false" can-focus="false" space-fill="false" space-expand="false">
								<label>Cookies：</label>
								<default>"$cookies_opt"</default>
								<variable>cookies_opt</variable>
								<action>if true enable:COOKIES_FILE</action>
								<action>if false disable:COOKIES_FILE</action>
								<action>sed -i "s/cookies_opt=.*/cookies_opt=\"\$cookies_opt\"/" "\$EDITABLE_OPTIONS"</action>
							</checkbox>
							<entry secondary-icon-name="gd-file" secondary-icon-tooltip-text="点击选择文件" editable="false" fs-action="file"
								fs-folder="$HOME" fs-filters="*.sqlite|*.txt" fs-title="选择 cookies.txt 或 cookies.sqlite 文件">
								<variable>COOKIES_FILE</variable>
								<sensitive>"$cookies_opt"</sensitive>
								<input>cat "\$EDITABLE_OPTIONS" | grep "COOKIES_FILE=" | cut -d\" -f2 </input>
								<action signal="secondary-icon-press">fileselect:COOKIES_FILE</action>
								<action>sed -i "s|COOKIES_FILE=.*|COOKIES_FILE=\"\$COOKIES_FILE\"|" "\$DEFAULT_OPTIONS"</action>
								<action>sed -i "s|COOKIES_FILE=.*|COOKIES_FILE=\"\$COOKIES_FILE\"|" "\$EDITABLE_OPTIONS"</action>
							</entry>
						</hbox>
						<hbox homogeneous="true" space-fill="true" height-request="32">
							<checkbox tooltip-text="-l, --playlist 选项，将所给的视频 URL 作为播放列表进行下载；注意，对于某些只是单个视频的播放链接，勾选此项会导致下载失败" focus-on-click="false" can-focus="false">
								<label>首选下载播放列表</label>
								<default>"$playlist_opt"</default>
								<variable>playlist_opt</variable>
								<action>sed -i "s/playlist_opt=.*/playlist_opt=\"\$playlist_opt\"/" "\$EDITABLE_OPTIONS"</action>
							</checkbox>
							<checkbox tooltip-text="-n, --no-merge 选项，不合并视频分片" focus-on-click="false" can-focus="false">
								<label>不合并视频分片</label>
								<default>"$no_merge_opt"</default>
								<variable>no_merge_opt</variable>
								<action>sed -i "s/no_merge_opt=.*/no_merge_opt=\"\$no_merge_opt\"/" "\$EDITABLE_OPTIONS"</action>
							</checkbox>
						</hbox>
						<hbox homogeneous="true" space-fill="true" height-request="32">
							<checkbox tooltip-text="--no-caption 选项，不要下载字幕（字幕、歌词、弹幕、…）" focus-on-click="false" can-focus="false">
								<label>不下载字幕文件</label>
								<default>"$no_caption_opt"</default>
								<variable>no_caption_opt</variable>
								<action>sed -i "s/no_caption_opt=.*/no_caption_opt=\"\$no_caption_opt\"/" "\$EDITABLE_OPTIONS"</action>
							</checkbox>
							<checkbox tooltip-text="--postfix 选项，使用唯一的标识符来下载文件" focus-on-click="false" can-focus="false">
								<label>使用唯一的标识符来下载文件</label>
								<default>"$postfix_opt"</default>
								<variable>postfix_opt</variable>
								<action>sed -i "s/postfix_opt=.*/postfix_opt=\"\$postfix_opt\"/" "\$EDITABLE_OPTIONS"</action>
							</checkbox>
						</hbox>
						<hbox homogeneous="true" space-fill="true" height-request="32">
							<checkbox tooltip-text="-f, --force 选项，该选项会强制覆盖现有文件，需谨慎使用" focus-on-click="false" can-focus="false">
								<label>强制覆盖现有文件</label>
								<default>"$force_opt"</default>
								<variable>force_opt</variable>
								<action>sed -i "s/force_opt=.*/force_opt=\"\$force_opt\"/" "\$EDITABLE_OPTIONS"</action>
							</checkbox>
							<checkbox tooltip-text="--skip-existing-file-size-check 选项，跳过现有文件而不检查文件大小" focus-on-click="false" can-focus="false">
								<label>跳过现有文件而不检查文件大小</label>
								<default>"$skip_existing_opt"</default>
								<variable>skip_existing_opt</variable>
								<action>sed -i "s/skip_existing_opt=.*/skip_existing_opt=\"\$skip_existing_opt\"/" "\$EDITABLE_OPTIONS"</action>
							</checkbox>
						</hbox>
						<hbox homogeneous="true" space-fill="true" height-request="32">
							<checkbox tooltip-text="-d, --debug 选项，打印跟踪和其他调试信息" focus-on-click="false" can-focus="false">
								<label>打印跟踪和其他调试信息</label>
								<default>"$debug_opt"</default>
								<variable>debug_opt</variable>
								<action>sed -i "s/debug_opt=.*/debug_opt=\"\$debug_opt\"/" "\$EDITABLE_OPTIONS"</action>
							</checkbox>
							<checkbox tooltip-text="-a, --auto-rename 选项，当输出路径中有同名文件时，自动重命名新下载的文件" focus-on-click="false" can-focus="false">
								<label>自动重命名新下载的文件</label>
								<default>"$auto_rename_opt"</default>
								<variable>auto_rename_opt</variable>
								<action>sed -i "s/auto_rename_opt=.*/auto_rename_opt=\"\$auto_rename_opt\"/" "\$EDITABLE_OPTIONS"</action>
							</checkbox>
						</hbox>
						<hbox homogeneous="true" space-fill="true" height-request="32">
							<checkbox tooltip-text="-k，--insecure 选项，允许不安全的 SSL 连接（将忽略 SSL 错误）" focus-on-click="false" can-focus="false">
								<label>允许不安全的 SSL 连接</label>
								<default>"$insecure_opt"</default>
								<variable>insecure_opt</variable>
								<action>sed -i "s/insecure_opt=.*/insecure_opt=\"\$insecure_opt\"/" "\$EDITABLE_OPTIONS"</action>
							</checkbox>
							<checkbox tooltip-text="-m, --m3u8 选项，选用该选项下载会很慢，仅适用于下载 m3u8 链接" focus-on-click="false" can-focus="false">
								<label>使用 m3u8 网址下载视频</label>
								<default>"$m3u8_opt"</default>
								<variable>m3u8_opt</variable>
								<action>sed -i "s/m3u8_opt=.*/m3u8_opt=\"\$m3u8_opt\"/" "\$EDITABLE_OPTIONS"</action>
							</checkbox>
						</hbox>
						<hseparator></hseparator>
						<text xalign="0" label="对以下选项做出的修改，在下次启动时仍然生效：" height-request="32"></text>
						<hbox tooltip-text="-o，--output-dir 选项，指定下载多媒体的输出目录">
							<checkbox width-request="100" focus-on-click="false" can-focus="false" inconsistent="true">
								<label>输出路径：</label>
								<default>true</default>
							</checkbox>
							<entry secondary-icon-name="gd-folder-plus" secondary-icon-tooltip-text="点击选择目录" editable="false"
								fs-folder="$OUTPUT_DIR" fs-filters-mime="inode/directory" fs-title="选择目录" fs-action="folder">
								<variable>OUTPUT_DIR</variable>
								<input>cat "\$EDITABLE_OPTIONS" | grep "OUTPUT_DIR=" | cut -d\" -f2 </input>
								<action signal="secondary-icon-press">fileselect:OUTPUT_DIR</action>
								<action>sed -i "s|OUTPUT_DIR=.*|OUTPUT_DIR=\"\$OUTPUT_DIR\"|" "\$DEFAULT_OPTIONS"</action>
								<action>sed -i "s|OUTPUT_DIR=.*|OUTPUT_DIR=\"\$OUTPUT_DIR\"|" "\$EDITABLE_OPTIONS"</action>
							</entry>
						</hbox>
						<hbox tooltip-text="设置 -p 选项所要调用的播放器">
							<checkbox width-request="100" focus-on-click="false" can-focus="false" inconsistent="true" space-fill="false" space-expand="false">
								<label>播放程序：</label>
								<default>true</default>
							</checkbox>
							<comboboxtext height-request="36" space-fill="true" space-expand="true" wrap-width="3">
								<variable>PLAYER</variable>
								<default>"$PLAYER"</default>
								<input>cat "\$PLAYER_LIST" | sed '/^#\|\[.*\]\|^[[:space:]]*$/d'</input>
								<action>sed -i "s/PLAYER=.*/PLAYER=\"\$PLAYER\"/" "\$DEFAULT_OPTIONS"</action>
								<action>sed -i "s/PLAYER=.*/PLAYER=\"\$PLAYER\"/" "\$EDITABLE_OPTIONS"</action>
								<action>info-dialog.sh player \$PLAYER &</action>
							</comboboxtext>
						</hbox>
					</vbox>
					
					<!-- 代理设置 -->
					<vbox>
						<frame>
							<text xalign="0" label="对以下选项做出的修改，只有手动保存后，才能在下次启动时保留：" height-request="32"></text>
							<radiobutton label="使用系统代理" active="$system_proxy_opt" height-request="36" focus-on-click="false" can-focus="false" 
								tooltip-text="系统代理会自动使用，除非使用 --no-proxy 强行关闭。">
								<variable>system_proxy_opt</variable>
								<action>if false enable:PROXY_SERVER</action>
								<action>if true disable:PROXY_SERVER</action>
								<action>if false enable:SOCKS5_PROXY_USERNAME</action>
								<action>if true disable:SOCKS5_PROXY_USERNAME</action>
								<action>if false enable:SOCKS5_PROXY_PASSWORD</action>
								<action>if true disable:SOCKS5_PROXY_PASSWORD</action>
								<action>sed -i "s/system_proxy_opt=.*/system_proxy_opt=\"\$system_proxy_opt\"/" "\$EDITABLE_OPTIONS"</action>
							</radiobutton>
							<radiobutton label="使用 HTTP 代理进行下载" active="$http_proxy_opt" height-request="36" focus-on-click="false" can-focus="false" 
								tooltip-text="-x 主机:端口, --http-proxy 主机:端口，使用 HTTP 代理进行下载">
								<variable>http_proxy_opt</variable>
								<action>if true enable:PROXY_SERVER</action>
								<action>if false disable:PROXY_SERVER</action>
								<action>if false enable:SOCKS5_PROXY_USERNAME</action>
								<action>if true disable:SOCKS5_PROXY_USERNAME</action>
								<action>if false enable:SOCKS5_PROXY_PASSWORD</action>
								<action>if true disable:SOCKS5_PROXY_PASSWORD</action>
								<action>sed -i "s/http_proxy_opt=.*/http_proxy_opt=\"\$http_proxy_opt\"/" "\$EDITABLE_OPTIONS"</action>
							</radiobutton>
							<radiobutton label="使用 HTTP 代理进行提取" active="$extractor_proxy_opt" height-request="36" focus-on-click="false" can-focus="false" 
								tooltip-text="-y 主机:端口, --extractor-proxy 主机:端口，使用 HTTP 代理进行提取">
								<variable>extractor_proxy_opt</variable>
								<action>if true enable:PROXY_SERVER</action>
								<action>if false disable:PROXY_SERVER</action>
								<action>if false enable:SOCKS5_PROXY_USERNAME</action>
								<action>if true disable:SOCKS5_PROXY_USERNAME</action>
								<action>if false enable:SOCKS5_PROXY_PASSWORD</action>
								<action>if true disable:SOCKS5_PROXY_PASSWORD</action>
								<action>sed -i "s/extractor_proxy_opt=.*/extractor_proxy_opt=\"\$extractor_proxy_opt\"/" "\$EDITABLE_OPTIONS"</action>
							</radiobutton>
							<radiobutton label="使用 SOCKS5 代理进行下载" active="$socks5_opt" height-request="36" focus-on-click="false" can-focus="false" 
								tooltip-text="-s 主机:端口 或 用户名:密码@主机:端口, --socks-proxy 主机:端口 或 用户名:密码@主机:端口，使用 SOCKS5 代理进行下载">
								<variable>socks5_opt</variable>
								<action>if true enable:PROXY_SERVER</action>
								<action>if false disable:PROXY_SERVER</action>
								<action>if true enable:SOCKS5_PROXY_USERNAME</action>
								<action>if false disable:SOCKS5_PROXY_USERNAME</action>
								<action>if true enable:SOCKS5_PROXY_PASSWORD</action>
								<action>if false disable:SOCKS5_PROXY_PASSWORD</action>
								<action>sed -i "s/socks5_opt=.*/socks5_opt=\"\$socks5_opt\"/" "\$EDITABLE_OPTIONS"</action>
							</radiobutton>
							<radiobutton label="不使用代理" active="$no_proxy_opt" height-request="36" focus-on-click="false" can-focus="false" 
								tooltip-text="--no-proxy，不使用一切代理，包括系统代理">
								<variable>no_proxy_opt</variable>
								<action>if false enable:PROXY_SERVER</action>
								<action>if true disable:PROXY_SERVER</action>
								<action>if false enable:SOCKS5_PROXY_USERNAME</action>
								<action>if true disable:SOCKS5_PROXY_USERNAME</action>
								<action>if false enable:SOCKS5_PROXY_PASSWORD</action>
								<action>if true disable:SOCKS5_PROXY_PASSWORD</action>
								<action>sed -i "s/no_proxy_opt=.*/no_proxy_opt=\"\$no_proxy_opt\"/" "\$EDITABLE_OPTIONS"</action>
							</radiobutton>
							<hbox tooltip-text="代理服务器，采用【 主机:端口 】的文本形式，比如 127.0.0.1:8087 或 proxy.uku.im:8888">
								<text xalign="0" label="代理服务器：" width-request="80"></text>
								<entry secondary-icon-name="gd-delete" secondary-icon-tooltip-text="消除文本">
									<variable>PROXY_SERVER</variable>
									<sensitive>false</sensitive>
									<input>cat "\$EDITABLE_OPTIONS" | grep "PROXY_SERVER=" | cut -d\" -f2 </input>
									<action signal="secondary-icon-press">clear:PROXY_SERVER</action>
									<action>sed -i "s/PROXY_SERVER=.*/PROXY_SERVER=\"\$PROXY_SERVER\"/" "\$EDITABLE_OPTIONS"</action>
									<action>text-filter.sh -t "\$PROXY_SERVER"</action>
									<action>refresh:PROXY_SERVER</action>
								</entry>
							</hbox>
							<hbox tooltip-text="使用 SOCKS5 代理时，需要输入的用户名。这是可选项，留空视为无用户名">
								<text xalign="0" label="用户名：" width-request="80"></text>
								<entry secondary-icon-name="gd-delete" secondary-icon-tooltip-text="消除文本">
									<variable>SOCKS5_PROXY_USERNAME</variable>
									<sensitive>false</sensitive>
									<input>cat "\$EDITABLE_OPTIONS" | grep "SOCKS5_PROXY_USERNAME=" | cut -d\" -f2 </input>
									<action signal="secondary-icon-press">clear:SOCKS5_PROXY_USERNAME</action>
									<action>sed -i "s/SOCKS5_PROXY_USERNAME=.*/SOCKS5_PROXY_USERNAME=\"\$SOCKS5_PROXY_USERNAME\"/" "\$EDITABLE_OPTIONS"</action>
									<action>text-filter.sh -t "\$SOCKS5_PROXY_USERNAME"</action>
									<action>refresh:SOCKS5_PROXY_USERNAME</action>
								</entry>
							</hbox>
							<hbox tooltip-text="使用 SOCKS5 代理时，需要输入的密码。这是可选项，留空视为无密码">
								<text xalign="0" label="密码：" width-request="80"></text>
								<entry secondary-icon-name="gd-delete" secondary-icon-tooltip-text="消除文本" visibility="false" invisible-char="42">
									<variable>SOCKS5_PROXY_PASSWORD</variable>
									<sensitive>false</sensitive>
									<input>cat "\$EDITABLE_OPTIONS" | grep "SOCKS5_PROXY_PASSWORD=" | cut -d\" -f2 </input>
									<action signal="secondary-icon-press">clear:SOCKS5_PROXY_PASSWORD</action>
									<action>sed -i "s/SOCKS5_PROXY_PASSWORD=.*/SOCKS5_PROXY_PASSWORD=\"\$SOCKS5_PROXY_PASSWORD\"/" "\$EDITABLE_OPTIONS"</action>
									<action>text-filter.sh -t "\$SOCKS5_PROXY_PASSWORD"</action>
									<action>refresh:SOCKS5_PROXY_PASSWORD</action>
								</entry>
							</hbox>
						</frame>
						<hbox>
							<button tooltip-text="将以上设置保存，以便在下次启动时仍然生效" space-expand="false" space-fill="false" 
								theme-icon-size="16" width-request="100" relief="1" focus-on-click="false">
								<label>"  保存设置"</label>
								<input file icon="gd-tool"></input>
								<action>sed -i "s/system_proxy_opt=.*/system_proxy_opt=\"\$system_proxy_opt\"/" "\$DEFAULT_OPTIONS"</action>
								<action>sed -i "s/http_proxy_opt=.*/http_proxy_opt=\"\$http_proxy_opt\"/" "\$DEFAULT_OPTIONS"</action>
								<action>sed -i "s/extractor_proxy_opt=.*/extractor_proxy_opt=\"\$extractor_proxy_opt\"/" "\$DEFAULT_OPTIONS"</action>
								<action>sed -i "s/socks5_opt=.*/socks5_opt=\"\$socks5_opt\"/" "\$DEFAULT_OPTIONS"</action>
								<action>sed -i "s/no_proxy_opt=.*/no_proxy_opt=\"\$no_proxy_opt\"/" "\$DEFAULT_OPTIONS"</action>
								<action>sed -i "s/PROXY_SERVER=.*/PROXY_SERVER=\"\$PROXY_SERVER\"/" "\$DEFAULT_OPTIONS"</action>
								<action>sed -i "s/SOCKS5_PROXY_USERNAME=.*/SOCKS5_PROXY_USERNAME=\"\$SOCKS5_PROXY_USERNAME\"/" "\$DEFAULT_OPTIONS"</action>
								<action>sed -i "s/SOCKS5_PROXY_PASSWORD=.*/SOCKS5_PROXY_PASSWORD=\"\$SOCKS5_PROXY_PASSWORD\"/" "\$DEFAULT_OPTIONS"</action>
								<action>info-dialog.sh succeeded &</action>
							</button>
							<text space-expand="true" space-fill="true" label=" "></text>
						</hbox>
					</vbox>
					
					<!-- 提取选项 -->
					<vbox>
						<text xalign="0" label="这里包含了三个复用解析数据选项，默认选用 -i 选项来提取信息" height-request="32"></text>
						<text xalign="0" label="对以下选项做出的修改，在下次启动时不会保留：" height-request="32"></text>
						<radiobutton label="-i, --info 选项，打印提取的信息" active="$extractor_info_opt" height-request="36" focus-on-click="false" can-focus="false">
							<variable>extractor_info_opt</variable>
							<action>if false enable:save_json_opt</action>
							<action>if true disable:save_json_opt</action>
							<action>if true : > "\$FILE_INFO" &</action>
							<action>sed -i "s/extractor_info_opt=.*/extractor_info_opt=\"\$extractor_info_opt\"/" "\$EDITABLE_OPTIONS"</action>
						</radiobutton>
						<radiobutton label="-u, --url 选项，获得页面所有可下载 URL 列表" active="$extractor_urls_opt" height-request="36" focus-on-click="false" can-focus="false">
							<variable>extractor_urls_opt</variable>
							<action>if false enable:save_json_opt</action>
							<action>if true disable:save_json_opt</action>
							<action>if true : > "\$FILE_INFO" &</action>
							<action>sed -i "s/extractor_urls_opt=.*/extractor_urls_opt=\"\$extractor_urls_opt\"/" "\$EDITABLE_OPTIONS"</action>
						</radiobutton>
						<radiobutton label="--json 选项，以 JSON 格式打印提取的 URL 列表" active="$extractor_json_opt" height-request="36" focus-on-click="false" can-focus="false">
							<variable>extractor_json_opt</variable>
							<action>if true enable:save_json_opt</action>
							<action>if false disable:save_json_opt</action>
							<action>if true : > "\$FILE_INFO" &</action>
							<action>sed -i "s/extractor_json_opt=.*/extractor_json_opt=\"\$extractor_json_opt\"/" "\$EDITABLE_OPTIONS"</action>
						</radiobutton>
						<checkbox tooltip-text="-l, --playlist 选项，配合以上的三个选项一起使用，以确定是否提取整个播放列表" height-request="36" focus-on-click="false" can-focus="false">
							<label>将所给的媒体 URL 作为播放列表来提取信息</label>
							<default>"$extractor_playlist_opt"</default>
							<variable>extractor_playlist_opt</variable>
							<action>if true : > "\$FILE_INFO" &</action>
							<action>sed -i "s/extractor_playlist_opt=.*/extractor_playlist_opt=\"\$extractor_playlist_opt\"/" "\$EDITABLE_OPTIONS"</action>
						</checkbox>
						<checkbox tooltip-text="当使用 --json 选项时，是否保存文件到输出目录" height-request="36" focus-on-click="false" can-focus="false">
							<label>将提取的 JSON 格式的信息保存到输出目录</label>
							<default>"$save_json_opt"</default>
							<sensitive>false</sensitive>
							<variable>save_json_opt</variable>
							<action>if true : > "\$FILE_INFO" &</action>
							<action>sed -i "s/save_json_opt=.*/save_json_opt=\"\$save_json_opt\"/" "\$EDITABLE_OPTIONS"</action>
						</checkbox>
					</vbox>
					
					<!-- 其它选项 -->
					<vbox>						
						<text xalign="0" label="这里包含了一些无法确定其用途的杂项，或者不常用的选项。" height-request="32"></text>
						<text xalign="0" label="对以下选项做出的修改，在下次启动时不会保留：" height-request="32"></text>
						<hbox tooltip-text="-P , --password 选项，设置视频的访问密码，不知道干嘛用">
							<checkbox width-request="100" focus-on-click="false" can-focus="false" space-fill="false" space-expand="false">
								<label>访问密码：</label>
								<default>"$password_opt"</default>
								<variable>password_opt</variable>
								<action>if true enable:PASSWORD</action>
								<action>if false disable:PASSWORD</action>
								<action>sed -i "s/password_opt=.*/password_opt=\"\$password_opt\"/" "\$EDITABLE_OPTIONS"</action>
							</checkbox>
							<entry secondary-icon-name="gd-delete" secondary-icon-tooltip-text="消除文本" visibility="false" invisible-char="42">
								<variable>PASSWORD</variable>
								<sensitive>false</sensitive>
								<input>cat "\$EDITABLE_OPTIONS" | grep "PASSWORD=" | cut -d\" -f2 </input>
								<action signal="secondary-icon-press">clear:PASSWORD</action>
								<action>sed -i "s/PASSWORD=.*/PASSWORD=\"\$PASSWORD\"/" "\$EDITABLE_OPTIONS"</action>
								<action>text-filter.sh -t "\$PASSWORD"</action>
								<action>refresh:PASSWORD</action>
							</entry>
						</hbox>
						<text xalign="0" label=" "></text>
						<frame 播放列表可选选项>
							<hbox tooltip-text="--first FIRST，第一个数字">
								<checkbox width-request="130" focus-on-click="false" can-focus="false" space-fill="false" space-expand="false">
									<label>第一个数字：</label>
									<default>"$first_opt"</default>
									<variable>first_opt</variable>
									<action>if true enable:FIRST</action>
									<action>if false disable:FIRST</action>
									<action>sed -i "s/first_opt=.*/first_opt=\"\$first_opt\"/" "\$EDITABLE_OPTIONS"</action>
								</checkbox>
								<spinbutton range-min="0" range-max="3600" wrap="true" space-fill="true" space-expand="true">
									<default>"$FIRST"</default>
									<variable>FIRST</variable>
									<sensitive>"$first_opt"</sensitive>
									<action>sed -i "s/FIRST=.*/FIRST=\"\$FIRST\"/" "\$EDITABLE_OPTIONS"</action>
									<action signal="changed">sed -i "s/FIRST=.*/FIRST=\"\$FIRST\"/" "\$EDITABLE_OPTIONS"</action>
								</spinbutton>
							</hbox>
							<hbox tooltip-text="--last LAST，最后一个数字">
								<checkbox width-request="130" focus-on-click="false" can-focus="false" space-fill="false" space-expand="false">
									<label>最后一个数字：</label>
									<default>"$last_opt"</default>
									<variable>last_opt</variable>
									<action>if true enable:LAST</action>
									<action>if false disable:LAST</action>
									<action>sed -i "s/last_opt=.*/last_opt=\"\$last_opt\"/" "\$EDITABLE_OPTIONS"</action>
								</checkbox>
								<spinbutton range-min="0" range-max="3600" wrap="true" space-fill="true" space-expand="true">
									<default>"$LAST"</default>
									<variable>LAST</variable>
									<sensitive>"$last_opt"</sensitive>
									<action>sed -i "s/LAST=.*/LAST=\"\$LAST\"/" "\$EDITABLE_OPTIONS"</action>
									<action signal="changed">sed -i "s/LAST=.*/LAST=\"\$LAST\"/" "\$EDITABLE_OPTIONS"</action>
								</spinbutton>
							</hbox>
							<hbox tooltip-text="--size PAGE_SIZE, --page-size PAGE_SIZE，页面大小的数字">
								<checkbox width-request="130" focus-on-click="false" can-focus="false" space-fill="false" space-expand="false">
									<label>页面大小的数字：</label>
									<default>"$page_size_opt"</default>
									<variable>page_size_opt</variable>
									<action>if true enable:PAGE_SIZE</action>
									<action>if false disable:PAGE_SIZE</action>
									<action>sed -i "s/page_size_opt=.*/page_size_opt=\"\$page_size_opt\"/" "\$EDITABLE_OPTIONS"</action>
								</checkbox>
								<spinbutton range-min="0" range-max="3600" wrap="true" space-fill="true" space-expand="true">
									<default>"$PAGE_SIZE"</default>
									<variable>PAGE_SIZE</variable>
									<sensitive>"$page_size_opt"</sensitive>
									<action>sed -i "s/PAGE_SIZE=.*/PAGE_SIZE=\"\$PAGE_SIZE\"/" "\$EDITABLE_OPTIONS"</action>
									<action signal="changed">sed -i "s/PAGE_SIZE=.*/PAGE_SIZE=\"\$PAGE_SIZE\"/" "\$EDITABLE_OPTIONS"</action>
								</spinbutton>
							</hbox>
						</frame>
					</vbox>
					
				</notebook>
			</frame>
		</hbox>
	</vbox>
	<action signal="show">refresh:VTE</action>
	
	<!-- xdotool 命令也可以控制窗口的初始位置 -->
	<!-- action signal="map-event">xdotool getactivewindow windowmove $X $Y</action -->
	
	<!-- 当窗口被移动、拉伸或最大化时，记录窗口的位置和大小 -->
	<action signal="configure-event">. "\$SAVE_GEOMETRY"</action>
	
	<!-- 获得窗口管理器所设置的边框宽度和标题栏高度 -->
	<action signal="map-event">[ -f "\$GEOMETRY_BORDER" ] || { . "\$SAVE_GEOMETRY" && cat "\$GEOMETRY" > "\$GEOMETRY_BORDER"; sed -i 's/X=/BX=/;s/Y=/BY=/;/^W\|^H/d' "\$GEOMETRY_BORDER" ;}</action>
</window>
EOF

SETTINGS_WINDOW_PID=$(ps -ef | grep "gtkdialog --class=You-Get-GUISettings --name=You-Get-GUISettings --program=Settings_WINDOW"  | grep -v grep | awk '{printf $2}')
[ "$SETTINGS_WINDOW_PID" ] && kill -9 $SETTINGS_WINDOW_PID
> "$PIPELINE"
sed -i 's/OUTPUT_NAME=.*/OUTPUT_NAME=""/' "$DEFAULT_OPTIONS"
exit
